import router from '@/router';
import axios from 'axios';
// import { ElMessage } from 'element-plus';
import { message } from 'ant-design-vue';
import { baseURL } from '../config/config';

enum IerrorCode {
  // 未经授权
  Unauthorized = '000001',
  // token过期
  TokenExpired = '000002',
  //被禁用
  Forbidden = '000003',
}

const ajax = axios.create({
  timeout: 3000,
  baseURL,
  // 解决session失效问题,但是
  withCredentials: true,
});

// 添加请求拦截器
ajax.interceptors.request.use(
  function (config) {
    // console.log(config);

    // 在发送请求之前做些什么
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    // return Promise.reject(error);
    message.error('网络异常');
  }
);

// 添加响应拦截器,由于考虑到可能会有后台,所以先把拦截器写好
ajax.interceptors.response.use(
  function (response) {
    const res = response.data;
    const { code, msg } = res;
    if (code === '0') {
      return Promise.resolve(res);
    } else {
      // 错误代码的处理
      switch (code) {
        case IerrorCode.Unauthorized:
        case IerrorCode.TokenExpired:
        case IerrorCode.Forbidden:
          router.push('/login');
          break;
        default:
          break;
      }
      if (msg) {
        message.error(msg);
      }
      return Promise.reject(res);
    }
  },
  function (error) {
    console.error(error);
    if (error.toString().indexOf('timeout') !== -1) {
      // 网络超时
      message.error('网络请求超时，请检查网络连接！');
    } else if (error.response) {
      switch (error.response.status) {
        // 对于响应码做出的错误处理
        case 400: // 客户端请求有误
          message.error('客户端请求有误，请联系管理员！');
          break;
        case 401: // 未授权
          message.error('未授权，请联系管理员！');
          break;
        case 403: // 禁止访问
          message.error('禁止访问！');
          break;
        case 404: // 找不到
          message.error('访问的资源不存在，请稍后重试！');
          break;
        case 502: // bad gateway
        case 503: // service unavailable
        case 504: // gateway timeout
          message.error('服务器维护中，请稍后重试！');
          break;
        case 500: // 服务器内部错误
        default:
          const errmsg = error.response.data.message;
          if (errmsg) {
            message.error(errmsg);
          } else {
            message.error('系统内部错误！');
          }
          break;
      }
    }
    // 对响应错误做点什么
    return Promise.reject(error.response);
  }
);

// 由于这个娃把from表单和json数据的axios二次封装了,因此考虑到我没写过完整度规范度极高的代码
export default ajax;
